import serial
import serial.tools.list_ports
import threading
import time

# 获取所有串口设备实例。
# 如果没找到串口设备，则输出：“无串口设备。”
# 如果找到串口设备，则依次输出每个设备对应的串口号和描述信息。
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
    print("无串口设备。")
else:
    print("可用的串口设备如下：")
    for comport in ports_list:
        print(list(comport)[0], list(comport)[1])
    
print("\r\n")
print(list(ports_list[1])[0], list(ports_list[1])[1],"\r\n")

# 打开 COM2，将波特率配置为115200，数据位为8，停止位为1，无校验位，读超时时间为0.5秒。
# ser = serial.Serial("COM2", 115200)    # 打开COM2，将波特率配置为115200，其余参数使用默认值

comNum = list(ports_list[2])[0]

ser = serial.Serial(port=comNum,
                    baudrate=115200,
                    bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    timeout=0.5) 


if ser.isOpen():                        # 判断串口是否成功打开
    print("打开串口成功。")
    print(ser.name)    # 输出串口号
else:
    print("打开串口失败。")

write_len = ser.write("ABCDEFG\r\n".encode('utf-8'))
print("串口发出{}个字节。".format(write_len))


# 定义接收数据的回调函数
def read_serial():
    while True:
        if ser.in_waiting > 0:
            data = ser.readline() 
            print(f"接收到的数据: {data.decode('utf-8').strip()}")
    
# 创建并启动线程
thread = threading.Thread(target=read_serial)
thread.daemon = True
thread.start()


# while True:
#     #com_input = ser.read(20).decode("utf-8") #去掉前面的b'以及\r\n
#     com_input = ser.read(20)
#     if com_input:   # 如果读取结果非空，则输出
#         print(com_input)
#         break
counter = 1
try:
    while True:
        time.sleep(1)
        counter = counter + 1
        time_str = 'Time'
        result = '%s is %d years old\r\n' % (time_str, counter) # 结果为 'Alice is 25 years old'
        write_len = ser.write(result.encode('utf-8'))

except KeyboardInterrupt:
    print("程序结束，正在关闭串口...")
    ser.close() 
    if ser.isOpen():                        # 判断串口是否关闭
        print("串口未关闭。")
    else:
        print("串口已关闭。")